import cv2
import numpy as np

# 读取输入图像
image = cv2.imread("../roi_img.jpg")  # 替换为你的图像路径
if image is None:
    raise ValueError("请确保图像路径正确且文件存在！")
(h, w) = image.shape[:2]  # 获取图像的高度和宽度

# 打印image的高度和宽度
print("(h,w) = ({},{})".format(h,w))   # (540,304)


# 1. 缩放 (Scaling)
scale = 0.5  # 缩放比例（小于1缩小，大于1放大）
resized = cv2.resize(image, (int(w * scale), int(h * scale)))  # 调整宽度和高度

# 2. 平移 (Translation)
tx, ty = 100, 50  # 水平方向平移 100 像素，竖直方向平移 50 像素
translation_matrix = np.float32([[1, 0, tx], [0, 1, ty]])  # 平移矩阵
translated = cv2.warpAffine(image, translation_matrix, (w, h))  # 应用平移变换

# 3. 旋转 (Rotation)
angle = 45  # 顺时针旋转 45 度
center = (w // 2, h // 2)  # 图像中心
scale = 1.0  # 缩放比例
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)  # 计算旋转矩阵    
rotated = cv2.warpAffine(image, rotation_matrix, (w, h))  # 应用旋转变换

# 4. 仿射变换 (Affine Transformation)
src_points = np.float32([[50, 50], [200, 50], [50, 200]])  # 原始图像中的三个点
dst_points = np.float32([[10, 100], [200, 50], [100, 250]])  # 目标图像中的三个点
affine_matrix = cv2.getAffineTransform(src_points, dst_points)  # 计算仿射变换矩阵
affine_transformed = cv2.warpAffine(image, affine_matrix, (w, h))  # 应用仿射变换

# 5. 透视变换 (Perspective Transformation)
src_points = np.float32([[0, 0], [w - 1, 0], [0, h - 1], [w - 1, h - 1]])  # 原始图像四角点
dst_points = np.float32([[50, 50], [w - 50, 100], [50, h - 50], [w - 100, h - 100]])  # 目标图像四角点
perspective_matrix = cv2.getPerspectiveTransform(src_points, dst_points)  # 计算透视变换矩阵
perspective_transformed = cv2.warpPerspective(image, perspective_matrix, (w, h))  # 应用透视变换

# 使用 OpenCV 显示结果
cv2.imshow("01 Original Image ", image)                                 # 原始图像
cv2.imshow("02 Resized ", resized)                                      # 缩放后的图像
cv2.imshow("03 Translated ", translated)                                # 平移后的图像
cv2.imshow("04 Rotated ", rotated)                                      # 旋转后的图像
cv2.imshow("05 Affine Transformed ", affine_transformed)                # 仿射变换后的图像
cv2.imshow("06 Perspective Transformed ", perspective_transformed)      # 透视变换后的图像

# 等待用户按键关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
